package com.diy.sigmund.diycommon.designpatterns.template;

/**
 * @author ylm-sigmund
 * @since 2022/1/13 11:19
 */
public abstract class TemplateClass {

    /**
     * 被声明为final，以免子类改变这个算法的顺序
     */
    final void templateMethod() {
        // 定义了一连串的步骤，每个步骤由一个方法代表
        primitiveOperation1();
        primitiveOperation2();
        concreteOperations();
        // 如果算法的这个部分是可选的，就可以使用钩子
        hook();
    }

    /**
     * 这是一个具体的方法，但它什么都不做
     * <br>我们也可以有“默认不做事的方法”，我们称这种方法为“hook”（钩子）。
     * <br>子类可以视情况决定要不要覆盖它们。
     *
     * <br>钩子是一种被声明在抽象类中的方法，但只有空的或者默认的实现。
     * <br>钩子的存在，可以让子类有能力对算法的不通电进行挂钩。
     * <br>要不要挂钩，由子类自行决定。
     *
     * <br>有了钩子，我能够决定要不要覆盖方法。
     * <br>如果我不提供自己的方法，抽象类会提供一个默认的实现
     */
    void hook() {
    }

    /**
     * 这里是实现
     */
    private void concreteOperations() {
        System.out.println("concreteOperations");
    }

    /**
     * 原语操作，具体类必须实现
     */
    protected abstract void primitiveOperation1();

    /**
     * 原语操作，具体类必须实现
     */
    protected abstract void primitiveOperation2();

}
